package com.yootk.rockemq.transaction;

import org.apache.rocketmq.client.producer.LocalTransactionState;
import org.apache.rocketmq.client.producer.TransactionListener;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

public class TransactionListenerImpl implements TransactionListener { // 事务消息监听
    private AtomicInteger transactionIndex = new AtomicInteger(0); // 操作计数
    // 保存每一个事务消息对应的业务的处理状态（KEY = 事务ID、VALUE=业务标记状态）
    private ConcurrentHashMap<String, Integer> localTransMap = new ConcurrentHashMap<>();
    @Override
    public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        // 此时需要在此方法里面编写具体的分布式业务更新方法调用代码
        int value = this.transactionIndex.getAndIncrement(); // 获取一个标记值
        int status = value % 3; // 每次调用此方法都会计算一个status内容
        this.localTransMap.put(msg.getTransactionId(), status); // 保存数据
        System.out.println("【executeLocalTransaction()】调用微服务方法：" + this.localTransMap);
        return LocalTransactionState.UNKNOW; // 执行分布式业务处理的时候不知道是否成功或失败
    }
    @Override
    public LocalTransactionState checkLocalTransaction(MessageExt msg) {
        System.err.println("【checkLocalTransaction()】检查事务状态：" + this.localTransMap);
        Integer status = this.localTransMap.get(msg.getTransactionId()); // 获取事务消息的ID
        if (status != null) {   // 获取到了事务的内容
            switch(status) {
                case 0: // 不知道的状态
                    int value = this.transactionIndex.getAndIncrement(); // 模拟业务处理
                    status = value % 3; // 每次调用此方法都会计算一个status内容
                    this.localTransMap.put(msg.getTransactionId(), status); // 保存数据
                    return LocalTransactionState.UNKNOW;
                case 1: // 成功的状态
                    return LocalTransactionState.COMMIT_MESSAGE; // 整个的事务成功
                case 2: // 表示失败的状态
                    return LocalTransactionState.ROLLBACK_MESSAGE; // 整个的事务需要回滚
            }
        }
        return LocalTransactionState.COMMIT_MESSAGE;
    }
}
